package net.vmiranda.traindroid.scrappers;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import net.vmiranda.traindroid.beans.rutas.Estacion;
import net.vmiranda.traindroid.beans.rutas.HorarioRuta;
import net.vmiranda.traindroid.beans.rutas.Nucleo;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import android.util.Log;

public class RenfeScrapper extends GenericScrapper {
	

	public static final String BASE_URL = "http://horarios.renfe.com/cer/hjcer310.jsp";
	public static final String BASE_NUCLEOS_URL = "http://horarios.renfe.com/cer/hjcer300.jsp";
	private static final String CABECERA_TAG = "cabe";
	
	
	public RenfeScrapper(){
		
	}



	public List<HorarioRuta> doHorariosPetition(String dia,String codNucleo,String origen,String destino,String horaInicio,String horaFin){
		List<HorarioRuta> listaHorarios = new ArrayList<HorarioRuta>();
		try {
			StringBuilder urlString = new StringBuilder(BASE_URL);
			urlString.append("?nucleo=").append(codNucleo);
			urlString.append("&o=").append(origen);
			urlString.append("&d=").append(destino);
			urlString.append("&tc=").append("DIA");
			urlString.append("&df=").append(dia);
			urlString.append("&th=").append("1");
			urlString.append("&ho=").append(horaInicio);
			urlString.append("&hd=").append(horaFin);

			urlString.append("&TXTInfo=");
			
			
			URL url = new URL(urlString.toString());
			try {
				Document document = Jsoup.parse(url, 500);
				Elements elementosCabecera = document.getElementsByClass(CABECERA_TAG);
				boolean trasbordos = hayTrasbordos(elementosCabecera);
				List<Element> horarios = document.getElementsByTag("tr");
				//me quito las dos primeras filas
				horarios.remove(0);
				horarios.remove(0);
				if(trasbordos){
					horarios.remove(0);
					horarios.remove(0);
				}
				for(Element horarioRuta : horarios){
					HorarioRuta hr = null;
					if(trasbordos){
						hr = procesaHorarioConTransbordo(horarioRuta);
					}else{
						hr = procesaHorarioSinTransbordo(horarioRuta);						
						
					}
					listaHorarios.add(hr);
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (MalformedURLException e) {
			
		}
		return listaHorarios;
	}



	private HorarioRuta procesaHorarioSinTransbordo(Element horarioRuta) {
		String horaSalida =  horarioRuta.getElementsByIndexEquals(0).text();
		String horaLlegada =  horarioRuta.getElementsByIndexEquals(1).text();
		String linea =  horarioRuta.getElementsByIndexEquals(2).text();
		String tiempo =  horarioRuta.getElementsByIndexEquals(3).text();
		HorarioRuta hr = new HorarioRuta();
		hr.setLineaOrigen(linea);
		hr.setSalidaOrigen(horaSalida);
		hr.setLlegadaDestino(horaLlegada);
		hr.setTiempoViaje(tiempo);
		return hr;
	}
	
	private HorarioRuta procesaHorarioConTransbordo(Element horarioRuta) {
	
		HorarioRuta hr = new HorarioRuta();
		hr.setLineaOrigen(horarioRuta.getElementsByIndexEquals(0).text());
		hr.setSalidaOrigen( horarioRuta.getElementsByIndexEquals(1).text());
		hr.setLlegadaTrasbordo(horarioRuta.getElementsByIndexEquals(2).text());
		hr.setSalidaTrasbordo(horarioRuta.getElementsByIndexEquals(3).text());
		hr.setLlegadaDestino(horarioRuta.getElementsByIndexEquals(4).text());
		hr.setLineaTrasbordo(horarioRuta.getElementsByIndexEquals(5).text());
		hr.setTiempoViaje(horarioRuta.getElementsByIndexEquals(5).text());
		return hr;
	}


	private boolean hayTrasbordos(List<Element> elementosCabecera) {
		for(Element elementoCabecera : elementosCabecera){
			if("Transbordo en".equalsIgnoreCase(elementoCabecera.text())){
				return true;
			}
		}
		return false;
		
	}
	
	//?&nucleo=10&o=18000&d=10001&tc=DIA&td=D&df=20110827&th=1&ho=00&i=s&cp=NO&TXTInfo=");
	
	
	/**
	 * Este metodo tendra que estar cacheado
	 * @param c
	 * @return
	 */
	public List<Estacion> getEstacionesNucleo(Nucleo c){
		List<Estacion> estaciones = new ArrayList<Estacion>();
		
		//me conecto a la URL
		try {
			StringBuilder urlString = new StringBuilder(BASE_NUCLEOS_URL);
			urlString.append("?nucleo=").append(c.getCodigo());
			Document document = Jsoup.parse(new URL(urlString.toString()), 500);
			List<Element> estacionesRaws = document.getElementsByTag("select").get(0).getElementsByTag("option");
			boolean ignorarPrimera = true;
			for(Element e : estacionesRaws){
				if(ignorarPrimera){
					ignorarPrimera = false;
					continue;
				}
				Estacion estacion = new Estacion(Integer.valueOf(e.val()),e.text());
				estaciones.add(estacion);
				Log.e("Estacion", estacion.toString());
			}
			 
		} catch (Exception e) {
		}
			
		return estaciones;
		
	}
	
	
	

	
	
	
	
}
